#include <iostream>
#include <memory>
#include <string>

#include "EpollServer.hpp"

using namespace Epoll;


Response TaskFunc(const Request& req)
{
    Response resp;
    switch(req._op)
    {
        case '+':
            resp._result = req._x + req._y;
            resp._code = 0;
            break;
        case '-':
            resp._result = req._x - req._y;
            resp._code = 0;
            break;
        case '*':
            resp._result = req._x * req._y;
            resp._code = 0;
            break;
        case '/':
            if(req._y == 0) 
            {
                resp._result = 0;
                resp._code = 1;
            }
            else
            {
                resp._result = req._x / req._y;
                resp._code = 0;
            }
            break;
        case '%':
            if(req._y == 0) 
            {
                resp._result = 0;
                resp._code = 2;
            }
            else 
            {
                resp._result = req._x % req._y;
                resp._code = 0;
            }
            break;

        default :
            resp._code = 3;
            break;
    }
    return resp;
}

void Calculate(Connection* conn,const Request& req)
{
    Response resp = TaskFunc(req); //处理计算
    std::string sendStr;
    resp.Serialize(&sendStr); //序列化并输出字符串
    sendStr = AddHeader(sendStr); //添加报头
    conn->_outbuffer += sendStr; //写入输出缓冲区
    // 对于发送
    // epoll中，关于fd的读取，一般要常设置(一直要让epoll关心的)
    // 关于fd的写入，一般是按需设置(不能常设置)，只有需要发送的时候，才设置！！
    conn->ser->EnableReadWrite(conn,true,true); //设置对 读写进行关心 第一次设置对写事件的关心 对应fd一般会立刻触发(因为发送缓冲区是空的)
    //只有读取到了完整报文 才调用业务处理 然后在业务处理中开启写入
}


int main()
{
    std::unique_ptr<Server> ser(new Server(Calculate,8088));
    ser->Init();
    ser->Dispatcher();
    return 0;
}